package com.tools.pojo.data;


import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class FsiEncounterDTO {

    /**
     * 诊疗ID
     */
    @NotBlank(message = "诊疗ID不能为空")
    @JsonProperty("mdtrt_id")
    private String mdtrtId;

    /**
     * 患者ID
     */
    @JsonProperty("patn_id")
    private String patnId;

    /**
     * 医疗机构ID
     */
    @JsonProperty("medins_id")
    private String medinsId;

    /**
     * 医疗机构名称
     */
    @JsonProperty("medins_name")
    private String medinsName;

    /**
     * 医疗机构行政区划
     */
    @JsonProperty("medins_admdvs")
    private String medinsAdmdvs;

    /**
     * 医疗机构类型
     */
    @JsonProperty("medins_type")
    private String medinsType;

    /**
     * 医疗机构等级
     */
    @JsonProperty("medins_lv")
    private String medinsLv;

    /**
     * 病区编码
     */
    @JsonProperty("wardarea_codg")
    private String wardareaCodg;

    /**
     * 病房号
     */
    @JsonProperty("wardno")
    private String wardno;

    /**
     * 床位号
     */
    @JsonProperty("bedno")
    private String bedno;

    /**
     * 入院日期
     */
    @JsonProperty("adm_date")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date admDate;

    /**
     * 出院日期
     */
    @JsonProperty("dscg_date")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date dscgDate;

    /**
     * 出院主要诊断编码
     */
    @JsonProperty("dscg_main_dise_codg")
    private String dscgMainDiseCodg;

    /**
     * 出院主要诊断名称
     */
    @JsonProperty("dscg_main_dise_name")
    private String dscgMainDiseName;

    /**
     * 诊断列表
     */
    @Valid
    @JsonProperty("fsi_diagnose_dtos")
    private List<FsiDiagnoseDTO> fsiDiagnoseDtos;

    /**
     * 费用列表
     */
    @JsonProperty("fsi_fee_dtos")
    private List<Object> fsiFeeDtos;

    /**
     * 医生编码
     */
    @JsonProperty("dr_codg")
    private String drCodg;

    /**
     * 医生姓名
     */
    @JsonProperty("dr_name")
    private String drName;

    /**
     * 入院科室编码
     */
    @JsonProperty("adm_dept_codg")
    private String admDeptCodg;

    /**
     * 入院科室名称
     */
    @JsonProperty("adm_dept_name")
    private String admDeptName;

    /**
     * 当前科室编码
     */
    @JsonProperty("cur_dept_codg")
    private String curDeptCodg;

    /**
     * 当前科室名称
     */
    @JsonProperty("cur_dept_name")
    private String curDeptName;

    /**
     * 出院科室编码
     */
    @JsonProperty("dscg_dept_codg")
    private String dscgDeptCodg;

    /**
     * 出院科室名称
     */
    @JsonProperty("dscg_dept_name")
    private String dscgDeptName;

    /**
     * 医疗诊疗类型
     */
    @JsonProperty("med_mdtrt_type")
    private String medMdtrtType;

    /**
     * 医疗类型
     */
    @JsonProperty("med_type")
    private String medType;

    /**
     * 医嘱列表
     */
    @Valid
    @JsonProperty("fsi_order_dtos")
    private List<FsiOrderDTO> fsiOrderDtos;

    /**
     * 孕产状态
     */
    @JsonProperty("matn_stas")
    private String matnStas;

    /**
     * 医疗总费用
     */
    @JsonProperty("medfee_sumamt")
    private BigDecimal medfeeSumamt;

    /**
     * 保险类型
     */
    @JsonProperty("insutype")
    private String insutype;

    /**
     * 报销标志
     */
    @JsonProperty("reim_flag")
    private String reimFlag;

    /**
     * 出院结算标志
     */
    @JsonProperty("out_setl_flag")
    private String outSetlFlag;

    /**
     * 手术列表
     */
    @JsonProperty("fsi_operation_dtos")
    private List<Object> fsiOperationDtos;

    /**
     * 患者住院次数
     */
    @JsonProperty("patn_ipt_cnt")
    private String patnIptCnt;

    /**
     * 医保费用结算类型
     */
    @JsonProperty("hi_feesetl_type")
    private String hiFeesetlType;

    /**
     * 医保支付方式
     */
    @JsonProperty("hi_paymtd")
    private String hiPaymtd;

    /**
     * 患者电话
     */
    @JsonProperty("psn_tel")
    private String psnTel;

    /**
     * 费用批次标识
     */
    @JsonProperty("fee_batch_sign")
    private String feeBatchSign;

    /**
     * 结算总次数
     */
    @JsonProperty("setl_totlnum")
    private Integer setlTotlnum;

    /**
     * 账单ID
     */
    @JsonProperty("bill_id")
    private String billId;

    /**
     * 住院号
     */
    @JsonProperty("ipt_no")
    private String iptNo;

    /**
     * 入院病情代码
     */
    @JsonProperty("adm_cond_code")
    private String admCondCode;

    /**
     * 产出类型
     */
    @JsonProperty("out_put_type")
    private String outPutType;

    /**
     * 任务ID
     */
    @JsonProperty("task_id")
    private String taskId;

    /**
     * 主要诊断
     */
    private FsiDiagnoseDTO mainDiagnosis;

    /**
     * 药物医嘱列表
     */
    private List<FsiOrderDTO> medicationOrders;

     /**
     * 次要诊断列表
     */
    private List<FsiDiagnoseDTO> secondaryDiagnoses;
    /**
     * 总药费
     */
    private BigDecimal totalMedicationCost;

    // 计算属性
    /**
     * 获取主要诊断
     */
    public FsiDiagnoseDTO getMainDiagnosis() {
        if (fsiDiagnoseDtos != null) {
            return fsiDiagnoseDtos.stream()
                    .filter(diagnose -> "1".equals(diagnose.getMaindiseFlag()))
                    .findFirst()
                    .orElse(null);
        }
        return null;
    }

    /**
     * 获取次要诊断列表
     */
    public List<FsiDiagnoseDTO> getSecondaryDiagnoses() {
        if (fsiDiagnoseDtos != null) {
            return fsiDiagnoseDtos.stream()
                    .filter(diagnose -> !"1".equals(diagnose.getMaindiseFlag()))
                    .toList();
        }
        return List.of();
    }

    /**
     * 获取药物医嘱
     */
    @JsonDeserialize(as = ArrayList.class)
    public List<FsiOrderDTO> getMedicationOrders() {
        if (fsiOrderDtos != null) {
            return fsiOrderDtos.stream()
                    .filter(order -> order.getHilistType() != null &&
                            order.getHilistType().startsWith("10")) // 药物类型
                    .toList();
        }
        return List.of();
    }

    /**
     * 获取总药费
     */
    public BigDecimal getTotalMedicationCost() {
        if (fsiOrderDtos != null) {
            return fsiOrderDtos.stream()
                    .map(FsiOrderDTO::getSumamt)
                    .filter(Objects::nonNull)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
        }
        return BigDecimal.ZERO;
    }
}